#ifndef PATHS_STRUCT_H
#define PATHS_STRUCT_H
#include <vector>
#include <utility>


struct PathsSegmentCached {
    std::vector<std::pair<double, double>> path_segment;
    int vehicle_in_segment_start_index;
    int vehicle_in_segment_index;
    std::vector<double> headings;
    std::vector<double> accumulated_s;
    std::vector<double> kappas;
    std::vector<double> dkappas;
};


struct FrenetHyperparameters
{
    //参数
    double Max_speed;      //最大速度 [m/s]，纵向和横向速度的尺量合
    double Max_accel;      //最大加速度[m/ss]
    double Max_curvature;  // 最大曲率 [1/m]
    double Max_road_width; // 最大道路宽度 [m]
    double Min_road_width; //最小道路宽度 [m]
    double middle_road_;
    double D_road_w;       //道路宽度采样间隔 [m]
    double Dt;             // 时间采样间隔[s]
    double Maxt;           // 最大预测时间 [s]
    double Mint;           //最小预测时间 [s]
    double D_t_s;          //目标速度采样间隔 [m/s]
    double N_s_sample;     // 目标速度的采样数量
    double D_s;            //目标位置采样间隔 [m]
    double N_s_position;   // 目标位置的采样数量

    //损失函数权重
    double kd; // Distance from reference path
    double kv; // Target speed
    double ka; // Target acceleration
    double kj; // Jerk
    double kt; // time

    //总的
    double klat; // Lateral
    double klon; // Longitudinal

    /* //横向权重
    double wlat_d; //横向偏差
    double wlat_v; //横向速度
    double wlat_a; //横向加速度
    double wlat_j; //横向jerk（舒适性，即加速度导数）
    //纵向权重
    double wlon_a; //纵向加速度
    double wlon_j; //纵向jerk
    double wlon_v; //纵向速度
    double wlon_t; //纵向时间（也就路径越短越好）

    //总的
    double wlat_score; // 横向权重得分
    double wlon_score; //纵向权重得分 */
};

struct FrenetInitialConditions
{
    double s0;   //初始的纵向值[m]
    double ds0;  //初始的纵向速度[m/s]
    double dds0; //初始的纵向加速度[m/ss]

    double d0;   //初始的横向偏移值 [m]
    double dd0;  //初始的横向速度 [m/s]
    double ddd0; //初始的横向加速度 [m/s^2]

    double ddT;             //目标横向速度配置
    double dddT;            //目标横向加速度配置
    double target_speed;    //目标速度（即纵向的速度保持） [m/s]
    double target_position; // 目标速度的采样数量
    // std::vector<std::pair<double, double>> xy_path_segment;
};

struct PointAndIndex {
    double x;
    double y;
    int index;
};

struct Point {
    double x, y;
};

struct myObstacle {
    double x;
    double y;

    myObstacle(double x, double y) : x(x), y(y) {}
};


#endif // PATHS_STRUCT_H

